' Written by Craig'n'Dave
Module Module1
    ' Quicksort using the Hoare partition scheme
    Function quicksort(items As List(Of String))
        ' A single item does not need sorting
        If items.Count <= 1 Then
            Return items
        Else
            ' Set the two pointer positions and pivot to be the first item
            Dim pointer1 As Integer = 1
            Dim pointer2 As Integer = items.Count - 1
            Dim pivot_value As String = items(0)
            Dim temp As String
            ' Partitioning step
            While pointer2 >= pointer1
                ' Move first pointer
                While pointer1 <= pointer2 And items(pointer1) <= pivot_value
                    pointer1 = pointer1 + 1
                End While
                ' Move second pointer
                While pointer2 >= pointer1 And items(pointer2) >= pivot_value
                    pointer2 = pointer2 - 1
                End While
                ' Swap items
                If pointer2 > pointer1 Then
                    temp = items(pointer1)
                    items(pointer1) = items(pointer2)
                    items(pointer2) = temp
                End If
            End While
            ' Put pivot item in position
            temp = items(0)
            items(0) = items(pointer2)
            items(pointer2) = temp

            ' Divide and conquer left and right of the pivot
            Dim new_list As New List(Of String)
            new_list.AddRange(quicksort(items.GetRange(0, pointer2)))
            new_list.Add(items(pointer2))
            new_list.AddRange(quicksort(items.GetRange(pointer2 + 1, items.Count() - 1 - pointer2)))
            Return new_list
        End If
    End Function

    'Main algorithm starts here
    Sub Main()
        Dim items As New List(Of String) From {"Florida", "Georgia", "Delaware", "Alabama", "California"}
        items = quicksort(items)
        Console.WriteLine(String.Join(", ", items))
    End Sub
End Module
